'''
Created on May 24, 2011


@author: Claudia Maria Luque Fernandez 
         Vanesa Gonzalez Perez
         Juan Jesus Fernandez Madrid

@organization: Universidad de Cordoba
         
@summary: En este modulo se encuentra la implementacion referente al modelo de la vista del MVC.

@requires: python, pyqt, nltk

@contact: i42lufec@uco.es , i52gopev@uco.es , i52femaj@uco.es

@version: 0.1

'''

import os
import platform
import sys
import ckControladorAp.controlador

from PyQt4.QtGui import QApplication, QDialog, QComboBox, QPushButton

from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import (PYQT_VERSION_STR, QFile, QFileInfo, QSettings,
        QString, QT_VERSION_STR, QTimer, QVariant, Qt, SIGNAL)
from PyQt4.QtGui import (QAction, QActionGroup, QApplication,
        QDockWidget, QFileDialog, QFrame, QIcon, QImage, QImageReader,
        QImageWriter, QInputDialog, QKeySequence, QLabel, QListWidget,
        QMainWindow, QMessageBox, QPainter, QPixmap, QPrintDialog,
        QPrinter, QSpinBox)



COLOR_AZUL = QtGui.QColor("#0000FF")
COLOR_ROSA = QtGui.QColor("#FF1493")
COLOR_MARRON = QtGui.QColor("#8B4513")
COLOR_VERDE = QtGui.QColor("#00CC00")
COLOR_ROJO = QtGui.QColor("#FF0000")
COLOR_NEGRO = QtGui.QColor("#000000")
COLOR_AMARILLO = QtGui.QColor("#FF8C00")   

FONT_NORMAL = QtGui.QFont('Helvetica', 12, )
FONT_NEGRITA = QtGui.QFont('Helvetica', 12, )
FONT_NEGRITA.setBold(True)
  

class App(QMainWindow):
    '''
        Clase que muestra la vista principal de la interfaz y el menu de la aplicacion.
    '''

    def __init__(self, parent=None):
        '''
            Constructor
        '''    
    

        super(App, self).__init__(parent)

        self.image = QImage()
        self.dirty = False
        self.filename = "false"
        self.mirroredvertically = False
        self.mirroredhorizontally = False
        
        
        self.setWindowTitle("Practica Final IAIC")

        self.setGeometry(100, 100, 250, 150)
                
        ##CREACION DE LA BARRA DE HERRAMIENTAS
        self.open = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/fileopen.png'), 'Abrir', self)
        self.open.setShortcut('Ctrl+O')
        self.connect(self.open, QtCore.SIGNAL('triggered()'), self.showCorpusText)
        
        self.run = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/entity.png'), 'Mostrar Entidades', self)
        self.run.setShortcut('Ctrl+R')
        self.connect(self.run, QtCore.SIGNAL('triggered()'), self.showEntities)
        
        
        self.man = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/man.png'), 'Mostrar Hombres', self)
        self.man.setShortcut('Ctrl+H')
        self.connect(self.man, QtCore.SIGNAL('triggered()'), self.showMan)
        
        
        self.woman = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/woman.png'), 'Mostrar Mujeres', self)
        self.woman.setShortcut('Ctrl+M')
        self.connect(self.woman, QtCore.SIGNAL('triggered()'), self.showWoman)
        
        
        self.assets = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/property.png'), 'Mostrar Bienes', self)
        self.assets.setShortcut('Ctrl+B')
        self.connect(self.assets, QtCore.SIGNAL('triggered()'), self.showProperty)
        
        
        self.renting = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/house.png'), 'Mostrar Arrendamientos', self)
        self.renting.setShortcut('Ctrl+A')
        self.connect(self.renting, QtCore.SIGNAL('triggered()'), self.showHouses)
        
        
        self.cleantextedit = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/cleartextedit.png'), 'Limpiar Area de Texto', self)
        self.cleantextedit.setShortcut('Ctrl+L')
        self.connect(self.cleantextedit, QtCore.SIGNAL('triggered()'), self.cleanMainTextEdit)
        
        
        self.cleanlogedit = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/clearlogedit.png'), 'Limpiar Area de Logs', self)
        self.cleanlogedit.setShortcut('Ctrl+K')
        self.connect(self.cleanlogedit, QtCore.SIGNAL('triggered()'), self.cleanLogTexEdit)
        
        
        self.exit = QtGui.QAction(QtGui.QIcon('./ckVistaAp/images/filequit.png'), 'Exit', self)
        self.exit.setShortcut('Ctrl+Q')
        self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        
        # Insertando la barra de herramientas dentro de la ventana de la app
        self.toolbar = self.addToolBar('Herramientas')
        self.toolbar.addAction(self.open)
        self.toolbar.addAction(self.run)
        self.toolbar.addAction(self.man)
        self.toolbar.addAction(self.woman)
        self.toolbar.addAction(self.assets)
        self.toolbar.addAction(self.renting)
        self.toolbar.addAction(self.cleantextedit)
        self.toolbar.addAction(self.cleanlogedit)
        self.toolbar.addAction(self.exit)
        
                
        # Area de texto
        self.textEdit = QtGui.QTextEdit("Texto del corpus")
        self.textEdit.setTextColor(COLOR_ROJO)
        self.textEdit.setMinimumSize(300, 300)
        self.setCentralWidget(self.textEdit)
         
        
        #Define el area del dock
        self.logDockWidget = QDockWidget("Log", self)
        self.logDockWidget.setMinimumSize(400, 300)
        self.logDockWidget.setObjectName("LogDockWidget")
        self.logDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
                
        #Area de logs
        self.logAreaText = QtGui.QTextEdit()
        self.logAreaText.setTextColor(COLOR_VERDE)      
        self.logAreaText.setReadOnly(True)
        self.logAreaText.setAutoFillBackground(True)
        self.logDockWidget.setWidget(self.logAreaText)
        self.addDockWidget(Qt.RightDockWidgetArea, self.logDockWidget)

        self.printer = None

        self.sizeLabel = QLabel()
        self.sizeLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
        
        #Crea una barra de estado
        self.status = self.statusBar()
        self.status.setSizeGripEnabled(False)
        self.status.addPermanentWidget(self.sizeLabel)
        self.status.showMessage("Listo", 5000)
        
        self.setMinimumSize(900, 600)

    
    
    def appendTextToMainTextEdit(self, message, color=COLOR_NEGRO):
        '''
            Anade texto a la ventana principal de texto
            @param message: El mensaje a anadir en el cuadro de texto 
            @param color: Color del texto a anadir 
        '''
        self.textEdit.setTextColor(color)
        self.textEdit.append(message)
        
        
    def addMessageToLog(self, message, color=COLOR_VERDE, font=FONT_NORMAL):
        '''
            Anade un mensaje al cuadro de Log, informando de aquello que sea conveniente informar
            @param message: Mensaje a mostrar en el area de Log
            @param color: Color con el que se mostrara el mensaje 
        '''
        self.logAreaText.setTextColor(color)
        
        
        if color == COLOR_ROJO:
            self.logAreaText.setFont(FONT_NEGRITA) 
        else:
            self.logAreaText.setFont(font)
            
            
        time = QtCore.QTime(QtCore.QTime.currentTime())
        
        tiemp =time.toString("HH") + ":" + time.toString("mm") + ":" +time.toString("ss")
        self.logAreaText.append("- "+tiemp+" : "+message + "\n")
      
     
    def setStatusMessage(self, message, time=2):  
        '''
            Muestra un mensaje de estado en la barra de estado
            @param message: Mensaje a mostrar en la barra de estado
            @param time: tiempo en segundos durante el cual se mostrara el mensaje en la barra de estado  
        '''     
        self.status.showMessage(message, time*1000)
        
        
            
    def showCorpusText(self):
        '''
           Carga data en el area de texto
        '''
        self.addMessageToLog("Abriendo cuadro dialogo")
        
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file','./corpus_arrend/')
       
        try:
            fname = open(filename)

            # Lee archivo
            data = fname.read()
            self.textEdit.setText(data)
            
            if(data == ""):      
                msj = "El documento estaba vacio."
                act = Action().showDialog(msj)
                self.setStatusMessage(msj, 3)
                self.addMessageToLog(msj, COLOR_ROJO)
            else:
                msj = "Texto cargado con exito"
                act = Action().showDialog(msj)
                self.setStatusMessage(msj, 3)
                self.addMessageToLog(msj)
                

        except IOError:
            self.addMessageToLog("No se ha seleccionado ningun archivo", COLOR_ROJO)
            self.setStatusMessage("No se ha seleccionado ningun archivo", 3)
        
        
        
    def cleanMainTextEdit(self):
        '''
            Limpia el texto del textedit principal
        '''
        
        self.textEdit.setText("")
        
        
        
    def cleanLogTexEdit(self):
        '''
            Limpia el cuadro de texto de los logs
        '''
        self.logAreaText.setText("")
        
        
        
    def checkThereIsText(self):
        '''
            Comprueba que hay texto en el cuadro de texto principal para ser procesado
        '''
        
        if self.textEdit.toPlainText() == "" or self.textEdit.toPlainText() == "Texto del corpus":
            
            act = Action().showDialog("No has abierto ningun archivo para ser procesado")
            
            return False
        else: 
            return True
        
        
        
    
    def showEntities(self):
        '''
            Muestra las entidades correspondietes, primero se pide la entidad a buscar, si no se introduce, se buscan todas
        '''
        
        if self.checkThereIsText():
               
            (text, ok) = QtGui.QInputDialog().getText(self, "Entidades", "Introduce el tipo de entidad:")
            
            
            if not ok:
                self.addMessageToLog("Operacion de muestra cancelada", COLOR_ROJO)
            else:
                if text =="":
                    self.addMessageToLog("No se ha introducido entidad.", COLOR_ROJO)
                    self.addMessageToLog("BUSCANDO TODAS LAS ENTIDADES", COLOR_ROJO)
                    self.setStatusMessage("Buscando todas las entidades", 5)
                    
                    ######################################################
                    
                    text = ckControladorAp.controlador.event_return_entities(str(self.textEdit.toPlainText()), self)
                    self.addMessageToLog(text)
                    
                    ######################################################
                    
                else:
                    self.addMessageToLog("Entidad a buscar: " + text)
                    self.setStatusMessage("Buscando la entidad: " + text, 5)
                    
                    ######################################################
                    
                    text = ckControladorAp.controlador.event_return_UNIQUE_entities(str(self.textEdit.toPlainText()), text, self)
                    self.addMessageToLog(text)
                    
                    ######################################################
                
        
        
    def showMan(self):
        '''
            Muesta las entidades que sean hombres
        '''
        
        
        if self.checkThereIsText():
            self.addMessageToLog("Entidad a mostrar: HOMBRES", COLOR_AZUL)
            self.setStatusMessage("Mostrando la entidad: HOMBRES", 5)
             
            text = ckControladorAp.controlador.event_return_MAN_entities(str(self.textEdit.toPlainText()), self)
            self.addMessageToLog(text, COLOR_AZUL)
        
        
        
    def showWoman(self):
        '''
            Muestra las entidades que sean mujeres
        '''

        
        if self.checkThereIsText():
            self.addMessageToLog("Entidad a mostrar: MUJERES", COLOR_ROSA)
            self.setStatusMessage("Mostrando la entidad: MUJERES", 5)
            
            text = ckControladorAp.controlador.event_return_WOMAN_entities(str(self.textEdit.toPlainText()), self)
            self.addMessageToLog(text, COLOR_ROSA)
        
        
        
    def showProperty(self):
        '''
            Muestra las entidades que sean bienes
        '''
        
        if self.checkThereIsText():
            self.addMessageToLog("Entidad a mostrar: BIENES", COLOR_AMARILLO)
            self.setStatusMessage("Mostrando la entidad: BIENES", 5)
            
            text = ckControladorAp.controlador.event_return_PROPERTY_entities(str(self.textEdit.toPlainText()), self)
            self.addMessageToLog(text, COLOR_AMARILLO)
        
        
        
    def showHouses(self):
        '''
            Muestra las entidades que sean arrendamientos
        '''
        
        if self.checkThereIsText():
            self.addMessageToLog("Entidad a mostrar: ARRENDAMIENTOS", COLOR_MARRON)
            self.setStatusMessage("Mostrando la entidad: ARRENDAMIENTOS", 5)
            
            text = ckControladorAp.controlador.event_return_HOUSES_entities(str(self.textEdit.toPlainText()), self)
            self.addMessageToLog(text, COLOR_MARRON)



        
        
class Action(QMainWindow):
    '''
        Ejecuta diferentes acciones
    '''
    
    
    def __init__(self, parent=None):
        '''
            Constructor
        '''
        super(Action, self).__init__(parent)
        
        self.filename = None
            
            
    def showDialog(self, data):
        '''
            Funcion para abrir un documento nuevo
        '''
        
        msgBox = QtGui.QMessageBox.information(self,"Informacion", data )        
        
        
         
